/**
 * 
 */
package net.toocruel.iqismart.web.init;

import net.toocruel.iqismart.dao.AreaRepository;
import net.toocruel.iqismart.dao.ResourceRepository;
import net.toocruel.iqismart.dao.RoleRepository;
import net.toocruel.iqismart.dao.UserRepository;
import net.toocruel.iqismart.dao.core.*;
import net.toocruel.iqismart.entity.common.Category;
import net.toocruel.iqismart.entity.constants.SourceType;
import net.toocruel.iqismart.entity.core.*;
import net.toocruel.iqismart.entity.rbac.User;
import net.toocruel.iqismart.service.core.*;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Random;

/**
 * 默认的系统数据初始化器，永远在其他数据初始化器之前执行
 * 
 * @author toocruel
 *
 */
@Component
public class TestDataInitializer extends AbstractDataInitializer {

	@Autowired
	private PasswordEncoder passwordEncoder;

	@Autowired
	private RoleRepository roleRepository;

	@Autowired
	private UserRepository userRepository;

	@Autowired
	private CategoryRepository categoryRepository;

	@Autowired
	private TagRepository tagRepository;

	@Autowired
	private TagService tagService;

	@Autowired
	protected ResourceRepository resourceRepository;

	@Autowired
	private GoodRepository goodRepository;

	@Autowired
	private QuestionRepository questionRepository;
	@Autowired
	private ArticleRepository articleRepository;

	@Autowired
	private QuestionService questionService;
	@Autowired
	private AnswerService answerService;
	@Autowired
	private ArticleService articleService;
	@Autowired
	private CommentRepository commentRepository;

	@Autowired
	private AuthenticationService authenticationService;
	@Autowired
	private AuthenticationRepository authenticationRepository;

	@Autowired
	private AreaRepository areaRepository;

	@Autowired
	private SupportService supportService;

	@Autowired
	private NoticeService noticeService;
	@Autowired
	private NoticeRepository noticeRepository;
	@Autowired
	private RecommendationService recommendationService;


	@Override
	public Integer getIndex() {
		return Integer.MAX_VALUE;
	}

	@Override
	protected void doInit() {

		initGoods();

		initArticle();

		initQUestion();

		initAuthertication();

		initNotice();

		initRecommendation();

	}

	private void initRecommendation() {
		if(CollectionUtils.isEmpty(authenticationRepository.findAll())){

		}else{
			return;
		}
		//带图
		Recommendation recommendation = new Recommendation();
		recommendation.setLogo("https://wenda.tipask.com/image/show/recommendations-7ne31feg58eee9a6f4196.jpg");
		recommendation.setStatus(1);
		recommendation.setSubject("网站运营怎么寻找“种子用户”？");
		recommendation.setSort(1);
		recommendation.setUrl("#");
		recommendationService.postRecommendation(recommendation);

		recommendation = new Recommendation();
		recommendation.setLogo("https://wenda.tipask.com/image/show/recommendations-RLR6Gjly5948ba472b65d.jpg");
		recommendation.setStatus(1);
		recommendation.setSubject("手把手教你把网站排名做到百度首页");
		recommendation.setSort(2);
		recommendation.setUrl("#");
		recommendationService.postRecommendation(recommendation);

		recommendation = new Recommendation();
		recommendation.setLogo("https://wenda.tipask.com/image/show/recommendations-XMrXL21N589de861a1c34.jpg");
		recommendation.setStatus(1);
		recommendation.setSubject("不会编程也能开发微信小程序的入门教程");
		recommendation.setSort(3);
		recommendation.setUrl("#");
		recommendationService.postRecommendation(recommendation);

		recommendation = new Recommendation();
		recommendation.setLogo("https://wenda.tipask.com/image/show/recommendations-RLR6Gjly5948ba472b65d.jpg");
		recommendation.setStatus(1);
		recommendation.setSubject("手把手教你把网站排名做到百度首页");
		recommendation.setSort(4);
		recommendation.setUrl("#");
		recommendationService.postRecommendation(recommendation);

		recommendation = new Recommendation();
		recommendation.setLogo("https://wenda.tipask.com/image/show/recommendations-XMrXL21N589de861a1c34.jpg");
		recommendation.setStatus(1);
		recommendation.setSubject("不会编程也能开发微信小程序的入门教程");
		recommendation.setSort(5);
		recommendation.setUrl("#");
		recommendationService.postRecommendation(recommendation);

		//不带图

		recommendation = new Recommendation();
		recommendation.setStatus(1);
		recommendation.setSubject("如何有效的提高百度收录速度");
		recommendation.setSort(6);
		recommendation.setUrl("#");
		recommendationService.postRecommendation(recommendation);

		recommendation = new Recommendation();
		recommendation.setStatus(1);
		recommendation.setSubject("论正确提问的姿势");
		recommendation.setSort(7);
		recommendation.setUrl("#");
		recommendationService.postRecommendation(recommendation);

		recommendation = new Recommendation();
		recommendation.setStatus(1);
		recommendation.setSubject("百度搜索升级,BaiduSpider3.0来看看都有哪些功能！");
		recommendation.setSort(8);
		recommendation.setUrl("#");
		recommendationService.postRecommendation(recommendation);

		recommendation = new Recommendation();
		recommendation.setStatus(1);
		recommendation.setSubject("奥巴马为何卸任后想做科技业的风险投资人？");
		recommendation.setSort(9);
		recommendation.setUrl("#");
		recommendationService.postRecommendation(recommendation);

		recommendation = new Recommendation();
		recommendation.setStatus(1);
		recommendation.setSubject("干货分享：网站优化的那些事");
		recommendation.setSort(10);
		recommendation.setUrl("#");
		recommendationService.postRecommendation(recommendation);

		recommendation = new Recommendation();
		recommendation.setStatus(1);
		recommendation.setSubject("知乎问答社区面临转型问题 知乎要变现了");
		recommendation.setSort(11);
		recommendation.setUrl("#");
		recommendationService.postRecommendation(recommendation);

		recommendation = new Recommendation();
		recommendation.setStatus(1);
		recommendation.setSubject("行家招募令，大牛快来认证吧！");
		recommendation.setSort(12);
		recommendation.setUrl("#");
		recommendationService.postRecommendation(recommendation);

		recommendation = new Recommendation();
		recommendation.setStatus(1);
		recommendation.setSubject("个人站长做网站没有内容来源怎么办？");
		recommendation.setSort(13);
		recommendation.setUrl("#");
		recommendationService.postRecommendation(recommendation);


	}

	private void initNotice() {
		if (CollectionUtils.isEmpty(noticeRepository.findAll())) {
			for (int i=0;i<10;i++) {
				Notice notice = new Notice();
			 	notice.setStatus(1);
			 	notice.setUrl("#");
			 	notice.setSubject("iqismart问答社区 1.0beta版本发布");
				noticeService.postNotice(notice);
			}
		}
	}

	private void initAuthertication() {
		if (CollectionUtils.isEmpty(authenticationRepository.findAll())) {
			for (int i=0;i<9;i++) {
				User randomUser = getRandomUser();
				Authentication oldAuth = authenticationRepository.findOne((root, query, cb) -> cb.equal(root.get("user"), randomUser));
				if(oldAuth != null){

				}else{
					Authentication authentication = new Authentication();
					authentication.setUser(randomUser);
					authentication.setTitle("程序员");
					authentication.setTags(tagService.findAndCreateIfNotExist(null,"java"));
					authentication.setDescription("开源爱好者‍");
					authentication.setProvince(areaRepository.findByNameAndGrade("上海",1));
					authentication.setStatus(1);
					authenticationRepository.save(authentication);
				}
			}
		}

	}

	private void initArticle() {
		if (CollectionUtils.isEmpty(articleRepository.findAll())) {
			for (int i=0;i<100;i++) {
				Article article = new Article();
				article.setCategory(getRandomCategorys());
				article.setTagNames(getRandomTagNames(2));
				article.setUser(getRandomUser());
				article.setViews(new Random().nextInt(1000));
				article.setTitle("你的SEO效果不明显的原因分析");
				article.setSummary("一，对搜索引擎存在误解 有很多朋友，特别是传统企业老板认为，只要关键词有排名就有效果，而且一两个星期就能提升排名，但并非如此。 首先，并不是关键词有排名就会有效果。因为用户每一");
				article.setLogo("https://wenda.tipask.com/image/show/attachments-2017-12-CJtOOqpv5a30906d33566.jpg");
				article.setContent("一，对搜索引擎存在误解\n" +
						"\n" +
						"attachments-2017-12-CJtOOqpv5a30906d33566.jpg\n" +
						"\n" +
						"有很多朋友，特别是传统企业老板认为，只要关键词有排名就有效果，而且一两个星期就能提升排名，但并非如此。\n" +
						"\n" +
						"\n" +
						"\n" +
						"首先，并不是关键词有排名就会有效果。因为用户每一次检索，都代表着一个需求。用户是要找到信息，所以才会搜索。也就是说当用户搜索某个关键词时，如果我们的网站能优先得到展示，而且我们的标题、描述有足够吸引力，那么用户就有机会进入我们的网站。此时如果我们的网站正好能解决用户的问题，满足其需求，那么他很可能会浏览一下我们的产品，从而才有可能产生交易。\n" +
						"\n" +
						"\n" +
						"\n" +
						"其次，并不是任意关键词得到展现后就会产生成效，即便我们能满足大部分用户需求。可能有的朋友会说，只要关键词的流量大，排上去就会有大量用户进来，客户做一个算一个。这种想法放在以前做传统媒体时好像还能说的通，但是放在互联网平台，这种思维明显不可取。\n" +
						"\n" +
						"\n" +
						"\n" +
						"一来，关键词排名需要时间，除非是投放搜索引擎广告，否则绝不可能在短时间内获得排名。因为搜索引擎优化是需要经过一定的排名周期才能获得的。这也是搜索引擎优化最大的成本：人力成本和时间成本。这就好比两个人要结婚，总不可能一认识就结婚吧。总得先认识，然后恋爱，慢慢相互了解，慢慢发展，一段时间后，才能谈婚论嫁吧。\n" +
						"\n" +
						"二来，并不是什么关键词都有可能产生交易。CCTV2的“经济与法”节目曾经谈到了百度竞价的话题，在该节目中有一个传统企业老板说到：“我是做铜门这个行业的，我就考虑以铜门作为关键词”。这是一个极大的误区。以“铜门”作为关键词虽然指数很高，但是很可能搜索的人主要是同行。试问在这种情况下，我们能产生交易吗?显然是不可能的。这是其一。其二是关键词排名获得的的流量是从第一名开始往下递减的，在谷歌上还好，在百度上，他的竞价排名和自然排名是混在一起的，试想，如果排名有5个竞价，这宗情况下我们的站还能获得多少流量?\n" +
						"\n" +
						"\n" +
						"\n" +
						"二，把搜索引擎优化想的过于简单\n" +
						"\n" +
						"\n" +
						"\n" +
						"很多朋友听信一些传言，认为做搜索引擎优化并不难，关于优化的大部分知识都可以在网上找到。于是一些新手就开始没日没夜地到网上去搜索引擎资料。找到这些资料后粗略看看，然后就觉得自己天下无敌了。在操作了几个排名之后就开始飘飘然。如果大家有留意的话，可能会发现每天都有一大批所谓的SEO主管在QQ群里吵个不停。每次搜索引擎算法大更新后，吵的最厉害的也是这些人。\n" +
						"\n" +
						"\n" +
						"\n" +
						"其实出现这些情况，是因为网上查到的内容，特别是免费的文章，大多都是一些很旧的知识。互联网变化太快，有时一个技巧刚出来，转眼间就会失效。所以，从这一方面来讲，互联网已经告别了免费分享时代，越来越多的前辈选择了不把知识分享出来。当然，网上的知识帮助大家入门是没有问题的，但请不要把这些内容当作圣经，特别是发布日期比较久远的文章。\n" +
						"\n" +
						"\n" +
						"\n" +
						"三，过度追求外链\n" +
						"\n" +
						"\n" +
						"\n" +
						"前面说到SEO优化并不简单，接下来要谈到这一点是过度追求外链。可能有朋友会反驳：SEO优化不就是靠更新内容和发外链吗?当然不是!\n" +
						"\n" +
						"\n" +
						"\n" +
						"想知道现在的搜索引擎优化对外链的追去到了何等疯狂的地步吗?看看现在各种群发、顶贴机，再看看链接交易何等火爆，就可知道现在对外链的追求已经达到了何种境地。\n" +
						"\n" +
						"\n" +
						"\n" +
						"其实，从外链发出的那天算起，它会经历几个时期：初生期、收录期、生效期、死亡期。很多朋友在某个网站上发了一个链接，然胡第二天就喊着怎么拍卖没有变化。事实上，搜索引擎对外链的统计是有一个周期的。而且，垃圾链接，也就是非必要的链接，对网站来说不但没有帮助，还会有危害，而且非常大。\n" +
						"\n" +
						"\n" +
						"\n" +
						"随着搜索引擎算法的改变，外链的重要性正在降低。虽然不会低到毫无作用，但他的确比如以前那么重要了。所以大家应该把中心转到内容上和营销上，而不应该放在外链上。\n" +
						"\n" +
						"\n" +
						"\n" +
						"约定随心整编。");

				article = articleService.postArticle(article);

				Comment comment = new Comment();
				comment.setUser(userRepository.findByUsername("user2"));
				comment.setArticle(article);
				comment.setContent("xx");
				commentRepository.save(comment);

				if(System.currentTimeMillis()%3 == 0){
					supportService.support(getRandomUser(),SourceType.article,article.getId());
				}
			}
		}

	}

	private User getRandomUser() {
		List<User> all = userRepository.findAll();
		Collections.shuffle(all);
		return all.get(0);
	}

	private void initQUestion() {
		if (CollectionUtils.isEmpty(questionRepository.findAll())) {
			for (int i=0;i<100;i++) {
				Question question = new Question();
				question.setCategory(getRandomCategorys());
				question.setTitle("如何有效的提高百度收录速度");
				question.setDescription("对于很多seo新手朋友都存在一个很郁闷的问题，那就是网站收录太慢，特别是新站首页都没收录的情况下，更是 急 ！急 ！急！，要明白百度为什么不收录，就知道他收录的流程是什么。");
				question.setUser(getRandomUser());
				question.setViews(new Random().nextInt(1000));
				question.setPrice(System.currentTimeMillis()%3==0?0:new Random().nextInt(20));
				question.setTagNames(getRandomTagNames(3));

				question = questionService.postQuestion(question);

				Answer answer = new Answer();
				answer.setUser(getRandomUser());
				answer.setQuestion(question);
				answer.setContent("赞个！但是新站发外链按照你这样说，权重高的发不了，权重低的没用，还发不了！那怎么发？这样发行不？");
				answerService.postAnswer(answer,false);

				Comment comment = new Comment();
				comment.setUser(getRandomUser());
				comment.setQuestion(question);
				comment.setContent("xx");
				commentRepository.save(comment);

				comment = new Comment();
				comment.setUser(getRandomUser());
				comment.setAnswer(answer);
				comment.setContent("xx");
				commentRepository.save(comment);

				if(System.currentTimeMillis()%3 == 0){
					supportService.support(getRandomUser(),SourceType.question,question.getId());
				}
			}
		}
	}

	private void initGoods() {
		if (CollectionUtils.isEmpty(goodRepository.findAll())) {
			for (int i=0;i<100;i++) {
				Good good = new Good();
				good.setCoin(100);
				good.setName("程序安装服务");
				good.setDescription("K120键盘");
				good.setLogo("https://wenda.tipask.com/image/show/goods-1605-HGEeaP8u574504e1aad4d.png");
				goodRepository.save(good);
			}
		}
	}

	private String getRandomTagNames(int count){
		ArrayList<String> tagNames = new ArrayList<>();
		tagNames.add("iqismart");
		tagNames.add("程序发布");
		tagNames.add("程序安装");
		tagNames.add("使用教程");
		tagNames.add("bug反馈");
		tagNames.add("互联网");
		tagNames.add("SEO");

		Collections.shuffle(tagNames);
		return  StringUtils.join(tagNames.subList(0, 3).toArray(),",");
	}

	private Category getRandomCategorys(){

		List<Category> categories = categoryRepository.findAll();
		Collections.shuffle(categories);
		return	categories.get(0);
	}

	@Override
	protected boolean isNeedInit() {
		return true;
	}

}
